﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Frp客户端.Dto
{
    /// 表示整个配置的根实体类，对应JSON结构的最外层对象
    /// <summary>
    /// 根配置类，包含了整个应用程序相关的各种配置信息，如认证、服务器地址、日志、Web服务器以及代理等配置。
    /// </summary>
    public class FrpcConfig
    {
        // 对应JSON中的"auth"字段，包含认证相关的配置信息
        /// <summary>
        /// 认证配置属性，用于存储认证相关的详细设置，例如认证方法和认证令牌等信息。
        /// </summary>
        [JsonProperty("auth")]
        public AuthConfig Auth { get; set; }

        /// 对应JSON中的"serverAddr"字段，服务器的IP地址
        /// <summary>
        /// 服务器地址属性，用于指定应用程序要连接的服务器的IP地址。
        /// </summary>
        [JsonProperty("serverAddr")]
        public string ServerAddr { get; set; }

        /// 对应JSON中的"serverPort"字段，服务器的端口号
        /// <summary>
        /// 服务器端口属性，用于指定应用程序要连接的服务器的端口号。
        /// </summary>
        [JsonProperty("serverPort")]
        public int ServerPort { get; set; }

        /// 对应JSON中的"log"字段，日志相关的配置信息
        /// <summary>
        /// 日志配置属性，用于设置日志记录的相关参数，比如日志输出位置、日志级别、日志保留天数以及是否禁用彩色打印等。
        /// </summary>
        [JsonProperty("log")]
        public LogConfig Log { get; set; }

        /// 对应JSON中的"webServer"字段，Web服务器相关的配置信息
        /// <summary>
        /// Web服务器配置属性，用于定义Web服务器运行的地址和端口等关键信息。
        /// </summary>
        [JsonProperty("webServer")]
        public WebServerConfig WebServer { get; set; }

        /// 对应JSON中的"proxies"字段，代理相关的配置信息列表，一个列表可包含多个代理配置
        /// <summary>
        /// 代理配置列表属性，用于存储多个代理相关的详细配置信息，每个元素代表一个具体的代理设置。
        /// </summary>
        [JsonProperty("proxies")]
        public List<ProxyConfig> Proxies { get; set; }
    }

    // 认证相关配置类，对应JSON中"auth"对象内部的结构
    /// <summary>
    /// 认证配置类，用于具体描述认证方式以及认证所使用的令牌等详细信息。
    /// </summary>
    public class AuthConfig
    {
        /// 对应JSON中的"method"字段，认证方法，如"token"等
        /// <summary>
        /// 认证方法属性，用于指定采用的认证方式，例如常见的"token"方式等。
        /// </summary>
        [JsonProperty("method")]
        public string Method { get; set; }

        /// 对应JSON中的"token"字段，认证使用的令牌内容
        /// <summary>
        /// 认证令牌属性，存储具体的认证令牌字符串，用于在认证过程中验证身份等用途。
        /// </summary>
        [JsonProperty("token")]
        public string Token { get; set; }
    }

    /// 日志相关配置类，对应JSON中"log"对象内部的结构
    /// <summary>
    /// 日志配置类，用于设置日志记录方面的各种参数，如输出目标、日志级别、保留天数以及颜色设置等。
    /// </summary>
    public class LogConfig
    {
        /// 对应JSON中的"to"字段，日志输出的目标，如"console"表示输出到控制台
        /// <summary>
        /// 日志输出目标属性，用于指定日志信息要输出到的地方，比如常见的输出到控制台（"console"）等情况。
        /// </summary>
        [JsonProperty("to")]
        public string To { get; set; }

        /// 对应JSON中的"level"字段，日志记录的级别，如"info"表示信息级别
        /// <summary>
        /// 日志级别属性，用于确定要记录的日志的详细程度，例如"info"级别会记录一般的信息日志等。
        /// </summary>
        [JsonProperty("level")]
        public string Level { get; set; }

        /// 对应JSON中的"maxDays"字段，日志文件保留的最大天数
        /// <summary>
        /// 日志最大保留天数属性，用于设置日志文件在系统中保留的最长时间，超过该天数的日志文件可能会被清理。
        /// </summary>
        [JsonProperty("maxDays")]
        public int MaxDays { get; set; }

        /// 对应JSON中的"disablePrintColor"字段，是否禁用日志打印的彩色显示
        /// <summary>
        /// 禁用打印颜色属性，用于决定在输出日志时是否禁用彩色显示，通常在某些特定环境下可能需要禁用彩色以保证兼容性等。
        /// </summary>
        [JsonProperty("disablePrintColor")]
        public bool DisablePrintColor { get; set; }
    }

    /// Web服务器相关配置类，对应JSON中"webServer"对象内部的结构
    /// <summary>
    /// Web服务器配置类，用于配置Web服务器运行的具体网络地址和端口信息。
    /// </summary>
    public class WebServerConfig
    {
        // 对应JSON中的"addr"字段，Web服务器的IP地址
        /// <summary>
        /// Web服务器地址属性，用于指定Web服务器监听的IP地址，例如常见的本地回环地址"127.0.0.1"等情况。
        /// </summary>
        [JsonProperty("addr")]
        public string Addr { get; set; }

        /// 对应JSON中的"port"字段，Web服务器的端口号
        /// <summary>
        /// Web服务器端口属性，用于指定Web服务器监听的端口号，不同的应用可能使用不同的端口来提供服务。
        /// </summary>
        [JsonProperty("port")]
        public int Port { get; set; }
    }

    // 代理相关配置类，对应JSON中"proxies"数组里每个对象的内部结构
    /// <summary>
    /// 代理配置类，用于详细描述每个代理的相关设置，包括代理名称、类型、本地和远程相关端口以及子域名等信息（部分属性根据不同代理类型可能有不同要求和用途）。
    /// </summary>
    public class ProxyConfig
    {
        /// 对应JSON中的"name"字段，代理的名称
        /// <summary>
        /// 代理名称属性，用于给每个代理设置一个唯一的标识名称，方便在配置和管理中进行区分。
        /// </summary>
        [JsonProperty("name")]
        public string Name { get; set; }

        // 对应JSON中的"type"字段，代理的类型，如"tcp"、"http"等
        /// <summary>
        /// 代理类型属性，用于指定代理所采用的协议类型，常见的有"tcp"、"http"等不同类型，不同类型有不同的功能和配置特点。
        /// </summary>
        [JsonProperty("type")]
        public string Type { get; set; }

        /// 对应JSON中的"localIP"字段，代理的本地IP地址
        /// <summary>
        /// 本地IP地址属性，用于指定代理在本地网络中的IP地址，通常可能是本地回环地址等情况。
        /// </summary>
        [JsonProperty("localIP")]
        public string LocalIP { get; set; }

        /// 对应JSON中的"localPort"字段，代理的本地端口号
        /// <summary>
        /// 本地端口属性，用于指定代理在本地监听的端口号，通过该端口接收和转发相关数据。
        /// </summary>
        [JsonProperty("localPort")]
        public int LocalPort { get; set; }

        /// /对应JSON中的"remotePort"字段，代理的远程端口号（部分代理类型可能需要该属性）
        /// <summary>
        /// 远程端口属性，用于指定代理连接远程服务的端口号，对于一些代理类型来说，该属性是必需的配置项。
        /// </summary>
        [JsonProperty("remotePort")]
        public int? RemotePort { get; set; }

        /// 对应JSON中的"subdomain"字段，代理对应的子域名（部分代理类型可能需要该属性）
        /// <summary>
        /// 子域名属性，用于指定与代理相关联的子域名信息，在一些基于域名的代理配置场景中会用到该属性。
        /// </summary>
        [JsonProperty("subdomain")]
        public string Subdomain { get; set; }
    }
}
